{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Thermometer Encoding" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from conx import Network\n", "import numpy as np\n", "import theano.tensor as T\n", "import theano\n", "import random" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "from mpl_toolkits.mplot3d import Axes3D\n", "from matplotlib import cm\n", "from matplotlib.ticker import LinearLocator, FormatStrFormatter\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.1 Learning to add: one output" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": true }, "outputs": [], "source": [ "net = Network(2, 2, 1, activation_function=T.nnet.sigmoid)\n", "#net.batch = True" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# input low and high values:\n", "ilo = -1\n", "ihi = 1\n", "# output low and high values:\n", "olo = 0\n", "ohi = 1" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": true }, "outputs": [], "source": [ "net.set_inputs([[random.random() * 2 - 1, random.random() * 2 - 1] for i in range(1000)])" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": true }, "outputs": [], "source": [ "f = lambda ins: [((ins[0] + ins[1])/2 + 1)/2]\n", "net.set_target_function(f)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Training for max trails: 5000 ...\n", "Epoch: 107 TSS error: 0.858317748173 %correct: 94.19999999999999\n", "Epoch: 120 TSS error: 0.125718711285 %correct: 99.6\n", "Epoch: 140 TSS error: 0.106452514751 %correct: 99.6\n", "Epoch: 160 TSS error: 0.106062935761 %correct: 99.6\n", "Epoch: 180 TSS error: 0.0940164321403 %correct: 99.7\n", "Epoch: 200 TSS error: 0.107933787015 %correct: 99.7\n", "Epoch: 220 TSS error: 0.0656636624831 %correct: 99.7\n", "Epoch: 240 TSS error: 0.059195051214 %correct: 99.7\n", "Epoch: 260 TSS error: 0.0597954341883 %correct: 99.7\n", "Epoch: 280 TSS error: 0.0535763699632 %correct: 99.7\n", "Epoch: 298 TSS error: 0.0835849762444 %correct: 99.7\n", "\n", "Interrupted by user; stopping...\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreport_rate\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m.05\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/conx-1.0.6-py3.5.egg/conx/network.py\u001b[0m in \u001b[0;36mtrain\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 546\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 547\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minterrupted\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 548\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 549\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhistory\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mepoch\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcorrect\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mtotal\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 550\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"-\"\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m50\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "net.train(report_rate=20, tolerance=.05)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Test:\n", "******************************\n", "Input : -0.6, 0.5 \n", "Output: 0.5 \n", "Target: 0.5 Correct\n", "******************************\n", "Input : -0.2, 0.4 \n", "Output: 0.6 \n", "Target: 0.5 Correct\n", "******************************\n", "Input : 0.4,-0.6 \n", "Output: 0.4 \n", "Target: 0.4 Correct\n", "******************************\n", "Input : -0.9, 0.5 \n", "Output: 0.4 \n", "Target: 0.4 Correct\n", "******************************\n", "Input : -0.1, 0.5 \n", "Output: 0.6 \n", "Target: 0.6 Correct\n", "******************************\n", "Input : -0.1,-0.3 \n", "Output: 0.4 \n", "Target: 0.4 Correct\n", "******************************\n", "Input : 0.2,-0.2 \n", "Output: 0.5 \n", "Target: 0.5 Correct\n", "******************************\n", "Input : 0.5,-0.7 \n", "Output: 0.5 \n", "Target: 0.5 Correct\n", "******************************\n", "Input : -0.2, 0.6 \n", "Output: 0.6 \n", "Target: 0.6 Correct\n", "******************************\n", "Input : -0.2,-0.3 \n", "Output: 0.4 \n", "Target: 0.4 Correct\n", "--------------------------------------------------\n", "Epoch: 298 TSS error: 0.000942803980877 %correct: 1.0\n" ] } ], "source": [ "net.test(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.2 Learning to add: thermometer encoding" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def therm(v, size=10):\n", " \"\"\"\n", " v - move range [ilo, ihi]\n", " returns thermometer encoding:\n", " [olo, olo, olo] \n", " [ohi, olo, olo]\n", " [ohi, ohi, olo]\n", " [ohi, ohi, ohi]\n", " \"\"\"\n", " ro = (ohi - olo) # output range\n", " ri = (ihi - ilo)\n", " t = (v - ilo) / ri # scale from input\n", " t_int = int(t * size) # int part\n", " t_float = round((t * size) - t_int, 2) # left over\n", " # left justified\n", " therm = ([ohi] * t_int + [t_float * ro + olo] + [olo] * size)[:size]\n", " return therm\n", "\n", "def untherm(vec):\n", " \"\"\"\n", " returns vec decoded - [ilo, ihi]\n", " \"\"\"\n", " size = len(vec)\n", " ro = (ohi - olo) # range\n", " total = 0\n", " for v in vec:\n", " total += ((v - olo) / ro)\n", " scale = total/size\n", " return scale * ro + olo " ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "therm(-1)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "therm(1)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": true }, "outputs": [], "source": [ "net = Network(2, 2, 10, activation_function=T.nnet.sigmoid)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "net.set_inputs([[random.random() * 2 - 1, random.random() * 2 - 1] for i in range(1000)])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "net.set_target_function(lambda ins: therm((ins[0] + ins[1])/2))" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def test_net(net, res=20):\n", " m = np.zeros((res, res))\n", " step = (ihi - ilo)/res\n", " for i in range(res):\n", " for j in range(res):\n", " m[i][j] = untherm(net.propagate([ilo + i * step, ilo + j * step]))\n", " plt.matshow(m, \n", " origin=\"lower\", # lower puts 0,0 bottom left\n", " extent=[ilo,ihi,ilo,ihi], # tick label ranges\n", " cmap=cm.coolwarm,\n", " interpolation=\"none\")\n", " plt.xlabel(\"input(0)\")\n", " plt.ylabel(\"input(1)\")\n", " plt.colorbar()" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def plot_net(net, res=20, angle=45):\n", " fig = plt.figure()\n", " ax = fig.gca(projection='3d')\n", "\n", " # Make data.\n", " X = np.arange(ilo, ihi, (ihi - ilo)/res)\n", " Y = np.arange(ilo, ihi, (ihi - ilo)/res)\n", "\n", " Z = np.array([[untherm(net.propagate([x, y])) for x in X] for y in Y])\n", " X, Y = np.meshgrid(X, Y)\n", "\n", " # Plot the surface.\n", " surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,\n", " linewidth=0, antialiased=False)\n", "\n", " # Customize the z axis.\n", " ax.set_zlim(olo - 0.01, ohi + 0.01)\n", " ax.zaxis.set_major_locator(LinearLocator(10))\n", " ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))\n", " ax.view_init(30, angle) # tilt, rotate\n", "\n", " # Add a color bar which maps values to colors.\n", " fig.colorbar(surf, shrink=0.5, aspect=5)\n", " plt.show()\n", " #display(fig)\n", " #fig.clear()" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Training for max trails: 5000 ...\n", "Epoch: 0 TSS error: 2510.7056395 %correct: 0.0\n", "Epoch: 20 TSS error: 22.7189946448 %correct: 96.2\n", "Epoch: 40 TSS error: 85.0225704254 %correct: 69.1\n", "Epoch: 60 TSS error: 15.1076404439 %correct: 98.7\n", "Epoch: 80 TSS error: 12.4463664997 %correct: 98.7\n", "Epoch: 100 TSS error: 12.5302482958 %correct: 98.8\n", "Epoch: 120 TSS error: 7.34241388651 %correct: 98.8\n", "Epoch: 140 TSS error: 17.810050253 %correct: 98.9\n", "Epoch: 160 TSS error: 7.46909319898 %correct: 98.9\n", "Epoch: 180 TSS error: 6.92952374574 %correct: 98.9\n", "Epoch: 200 TSS error: 11.2168213265 %correct: 99.1\n", "Epoch: 220 TSS error: 19.3624863711 %correct: 98.3\n", "Epoch: 240 TSS error: 11.6882641271 %correct: 99.1\n", "Epoch: 260 TSS error: 7.43680422059 %correct: 99.4\n", "Epoch: 280 TSS error: 9.06550120717 %correct: 99.4\n", "Epoch: 300 TSS error: 6.93877183779 %correct: 99.4\n", "Epoch: 320 TSS error: 64.9006024766 %correct: 78.2\n", "Epoch: 340 TSS error: 14.9153496545 %correct: 98.3\n", "Epoch: 360 TSS error: 7.02829378367 %correct: 99.4\n", "Epoch: 380 TSS error: 7.39079473552 %correct: 99.4\n", "Epoch: 400 TSS error: 6.8192970586 %correct: 99.4\n", "Epoch: 420 TSS error: 7.61541039185 %correct: 99.4\n", "Epoch: 440 TSS error: 7.40743449934 %correct: 99.4\n", "Epoch: 449 TSS error: 6.87514890655 %correct: 99.4\n", "\n", "Interrupted by user; stopping...\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreport_rate\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/conx-1.0.6-py3.5.egg/conx/network.py\u001b[0m in \u001b[0;36mtrain\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 546\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 547\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minterrupted\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 548\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 549\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhistory\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mepoch\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcorrect\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mtotal\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 550\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"-\"\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m50\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "net.train(report_rate=20, tolerance=0.3)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Test:\n", "******************************\n", "Input : 0.6, 0.9 \n", "Output: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.7, 0.1 \n", "Target: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.6, 0.0 Correct\n", "******************************\n", "Input : 0.2,-0.8 \n", "Output: 1.0, 1.0, 1.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 \n", "Target: 1.0, 1.0, 1.0, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 Correct\n", "******************************\n", "Input : 0.4, 0.2 \n", "Output: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.4, 0.0, 0.0, 0.0 \n", "Target: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.4, 0.0, 0.0, 0.0 Correct\n", "******************************\n", "Input : 0.1,-0.3 \n", "Output: 1.0, 1.0, 1.0, 1.0, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0 \n", "Target: 1.0, 1.0, 1.0, 1.0, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0 Correct\n", "******************************\n", "Input : 0.1, 0.2 \n", "Output: 1.0, 1.0, 1.0, 1.0, 1.0, 0.9, 0.1, 0.0, 0.0, 0.0 \n", "Target: 1.0, 1.0, 1.0, 1.0, 1.0, 0.9, 0.0, 0.0, 0.0, 0.0 Correct\n", "******************************\n", "Input : 0.5, 0.5 \n", "Output: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.7, 0.0, 0.0 \n", "Target: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.7, 0.0, 0.0 Correct\n", "******************************\n", "Input : 1.0, 0.5 \n", "Output: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.8, 0.1 \n", "Target: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.8, 0.0 Correct\n", "******************************\n", "Input : -0.9,-0.6 \n", "Output: 0.9, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 \n", "Target: 1.0, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 Correct\n", "******************************\n", "Input : -0.1, 0.4 \n", "Output: 1.0, 1.0, 1.0, 1.0, 1.0, 0.7, 0.0, 0.0, 0.0, 0.0 \n", "Target: 1.0, 1.0, 1.0, 1.0, 1.0, 0.7, 0.0, 0.0, 0.0, 0.0 Correct\n", "******************************\n", "Input : 0.4, 0.9 \n", "Output: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3, 0.0 \n", "Target: 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3, 0.0 Correct\n", "--------------------------------------------------\n", "Epoch: 449 TSS error: 0.06501795521 %correct: 1.0\n" ] } ], "source": [ "net.test(10)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_net(net)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n/H8qZu2neNNekAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_net(net, 45)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from ipywidgets import interact\n", "import ipywidgets as widgets" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "25878019e5f24e6483c9ba8f63c223dc" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ ">" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "interact(lambda i1, i2: untherm(net.propagate([i1, i2])), \n", " i1=widgets.FloatSlider(description=\"i1\",min=-1, max=1,step=.1),\n", " i2=widgets.FloatSlider(description=\"i2\",min=-1, max=1,step=.1))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def plot_net_angle(angle):\n", " plot_net(net, angle=angle)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "54423d82e24e4b0181416d6c1e307147" } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "interact(plot_net_angle, angle=widgets.IntSlider(min=-180,max=180,step=10,value=45));" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": true }, "outputs": [], "source": [ "net = Network(2, 2, 1, 10, activation_function=T.nnet.sigmoid)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": true }, "outputs": [], "source": [ "net.set_inputs([[random.random() * 2 - 1, random.random() * 2 - 1] for i in range(1000)])" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "net.set_target_function(lambda ins: therm((ins[0] + ins[1])/2))" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Training for max trails: 5000 ...\n", "Epoch: 0 TSS error: 2850.16701736 %correct: 0.0\n", "Epoch: 20 TSS error: 207.14527796 %correct: 46.400000000000006\n", "Epoch: 40 TSS error: 131.305744423 %correct: 67.80000000000001\n", "Epoch: 60 TSS error: 170.721752656 %correct: 48.6\n", "Epoch: 80 TSS error: 138.248276938 %correct: 64.0\n", "Epoch: 100 TSS error: 204.140035426 %correct: 39.6\n", "Epoch: 120 TSS error: 148.885256449 %correct: 61.5\n", "Epoch: 140 TSS error: 144.722290294 %correct: 56.599999999999994\n", "Epoch: 160 TSS error: 188.022897024 %correct: 56.699999999999996\n", "Epoch: 180 TSS error: 117.391768592 %correct: 66.10000000000001\n", "Epoch: 200 TSS error: 265.415587326 %correct: 36.7\n", "Epoch: 220 TSS error: 233.991274135 %correct: 40.5\n", "Epoch: 240 TSS error: 269.748310176 %correct: 39.800000000000004\n", "Epoch: 260 TSS error: 188.110259912 %correct: 47.599999999999994\n", "Epoch: 280 TSS error: 277.862951901 %correct: 26.0\n", "Epoch: 300 TSS error: 102.492181463 %correct: 84.1\n", "Epoch: 320 TSS error: 124.361227228 %correct: 70.5\n", "Epoch: 340 TSS error: 126.341169847 %correct: 66.7\n", "Epoch: 360 TSS error: 135.340700656 %correct: 61.6\n", "Epoch: 380 TSS error: 127.991074252 %correct: 57.9\n", "Epoch: 400 TSS error: 129.534127314 %correct: 61.7\n", "Epoch: 420 TSS error: 121.051423436 %correct: 74.7\n", "Epoch: 440 TSS error: 193.142507838 %correct: 32.2\n", "Epoch: 460 TSS error: 129.260376841 %correct: 66.3\n", "Epoch: 480 TSS error: 82.5990204239 %correct: 78.0\n", "Epoch: 500 TSS error: 244.520786672 %correct: 28.4\n", "Epoch: 520 TSS error: 169.474737281 %correct: 49.5\n", "Epoch: 540 TSS error: 178.675058541 %correct: 62.6\n", "Epoch: 560 TSS error: 130.207952252 %correct: 71.7\n", "Epoch: 580 TSS error: 109.035695015 %correct: 65.10000000000001\n", "Epoch: 600 TSS error: 306.46366474 %correct: 25.7\n", "Epoch: 620 TSS error: 126.841552378 %correct: 60.8\n", "Epoch: 640 TSS error: 172.182212011 %correct: 57.8\n", "Epoch: 660 TSS error: 191.39396117 %correct: 42.199999999999996\n", "Epoch: 668 TSS error: 96.3898127093 %correct: 81.0\n", "\n", "Interrupted by user; stopping...\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreport_rate\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/conx-1.0.6-py3.5.egg/conx/network.py\u001b[0m in \u001b[0;36mtrain\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 546\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 547\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minterrupted\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 548\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 549\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhistory\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mepoch\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcorrect\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mtotal\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 550\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"-\"\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m50\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "net.train(report_rate=20, tolerance=0.3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.3" } }, "nbformat": 4, "nbformat_minor": 2 }